package com.qf.usefull.stringdemo;

/**
 * String类中 intern方法的作用?
 *
 * intern方法的工作流程？
 * (1) 检查当前字符串对象在 （java运行时的一块内存区域）字符串常量池 中是否已经存在了
 * (2) 如果已经存在，则直接返回常量池中该对象的地址
 * (3) 如果没有，则会把当前字符串放入常量池中，然后在返回常量池中该字符串对象的地址
 *
 */
public class Demo02 {

    public static void main(String[] args) {

        String s1 = "hello";  // 字符串的字面值（程序代码中使用双引号引起来的字符串） ，该字符串会被放入字符串常量池中
        String s2 = "hello";  // 如果字符串常量池中已经存在在字符串的字面值了，那么直接返回该串的地址
//        System.out.println(s1==s2);  // 同一个常量池中的字符串对象的地址相同
//        System.out.println(s1.equals(s2));  // true

        String s3 = new String("hello");  // 在java的堆内存中申请对象的地址
//        System.out.println(s1==s3);        // false s1的地址在字符串常量池中， s3的地址在java的堆内存中
//        System.out.println(s1.equals(s3)); // true

        String s4 = s3.intern();     // 返回字符串常量池中的该字符串对象的地址（如果对象已经存在了，那么直接返回）
        System.out.println(s3==s4);  // false
        System.out.println(s1==s4);  // true


//        String intern = s1.intern();
//        System.out.println(intern);

    }

}
